#!/usr/bin/env python
# coding: utf-8

# SVM特别适合应用于复杂但中小规模数据集的分类问题

# 原理：就是希望有一条线不仅分开了两种类别，而且还尽可能地远离了最靠近的训练数据集

# 核函数：就是为了实现这种相似性映射

# 线性核函数：简单，效率高，对线性不可分无解

# 多项式核函数：对拟合出复杂的分割超平面，但可选参数太多，阶数高后计算困难，不稳定

# 高斯核函数：融合了上面两种核函数。计算速度比较慢，容易过拟合

# 如果遇到分类问题，何时使用逻辑回归何时使用SVM？

# 假设N是特征个数；M是训练数据集的样本个数，一般按照如下规则：

# 如果N相对M比较大，也就是说特征数量远多于样本数量时，使用逻辑回归或者线性核函数的SVM算法都可以

# 如果，N比较小，M中等大小（M是N的十倍左右），可以使用高斯核函数的SVM

# 如果，N比较小，M比较大（M是N的五十倍以上），这时特征数量相对较小，可以使用多项式核函数，高斯核函数SVM算法

# Scikit-learn对SVM的实现包含在sklearn.svm下面，其中SVC类用于分类，SVR用于回归(可以用离散值代替连续的数值回归)

# Linear线性函数：C惩罚系数

# Poly多项式：C惩罚系数，degree指定阶数

# Rbf高斯核函数：C惩罚系数，gamm值

# In[1]:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


# In[2]:


data=pd.read_csv('./credit-a.csv',header=None)


# In[3]:


data.head()


# In[4]:


from sklearn.model_selection import train_test_split


# In[5]:


x=data[data.columns[:-1]]


# In[6]:


y=data[15].replace(-1,0)


# In[7]:


x_train,x_test,y_train,y_test=train_test_split(x,y)


# 计算点的时候需要标准化

# In[8]:


from sklearn import preprocessing  #预处理模块包标准化


# In[9]:


scaler=preprocessing.StandardScaler().fit(x_train)       #标准化处理
x_train=scaler.transform(x_train)
x_test=scaler.transform(x_test)                     


# In[17]:


from sklearn.svm import SVC


# In[18]:


model=SVC(kernel="poly",degree=3,C=5)  #SVC说明是分类，kernel代表核函数，degree为阶数，C为惩罚系数


# In[19]:


model.fit(x_train,y_train)


# In[20]:


model.score(x_test,y_test)


# 试试其他核函数

# In[21]:


model=SVC(kernel="rbf",gamma=0.5,C=5)  #SVC说明是分类，kernel代表核函数，gamma值一般为0.5，C为惩罚系数


# In[22]:


model.fit(x_train,y_train)


# In[23]:


model.score(x_test,y_test)


# In[ ]:





# 交叉验证

# In[24]:


from sklearn.model_selection import GridSearchCV


# In[25]:


degree=range(80,130)
param_grid={'degree':degree} #参数


# In[ ]:


model=GridSearchCV(SVC(kernel="poly",C=5),param_grid,cv=5)
model.fit(x_train,y_train) #这个是直接把x与y放进去，不用把划分的放进去，它会自动划分
model.best_score_  #得出最高分数


# In[ ]:




